package com.kerbores.ad.entries;

import java.util.Date;

import org.nutz.dao.entity.annotation.Column;
import org.nutz.dao.entity.annotation.Id;
import org.nutz.dao.entity.annotation.Table;
import org.nutz.lang.Lang;

/**
 * @author 王贵源
 *
 *         create at 2014年9月25日 下午2:54:56
 * @description 在此处定义的资源都是可操作对象,可以是抽象的可操作资源
 */
@Table("ad_resource")
public class Resource {
	/**
	 * 资源类型枚举
	 * 
	 * @author 王贵源
	 *
	 *         create at 2014年9月25日 下午3:00:50
	 */
	public static enum RESOURCE_TYPE {
		DEFAULT, AUTHZ, AGENT, APPLICATIONSERVER, TOMCAT, NGINX, JETTY, LBDEVICE, LBPOOL, NETWORK, ROUTE
	}

	/**
	 * 资源状态枚举
	 * 
	 * @author 王贵源
	 *
	 *         create at 2014年9月25日 下午3:01:01
	 */
	public static enum RESOURCE_STATUS {
		DEFAULT, RUNNING, STOPED, STARTING, HI_CPU, HO_MEMORY, DISK_FULL
	}

	/**
	 * 资源日志类型枚举
	 * 
	 * @author 王贵源
	 *
	 *         create at 2014年9月25日 下午3:11:58
	 */
	public static enum RESOURCE_LOG_TYPE {
		APP, SERVER, DUMP, ACCESS
	}

	/**
	 * 编号,唯一
	 */
	@Id
	private int id;
	/**
	 * 资源名称
	 */
	@Column("res_name")
	private String name;
	/**
	 * 创建时间
	 */
	@Column("res_create_date")
	private Date createDate;
	/**
	 * 修改时间
	 */
	@Column("res_modify_date")
	private Date modifyDate;
	/**
	 * 资源状态
	 */
	@Column("res_status")
	private RESOURCE_STATUS status = RESOURCE_STATUS.DEFAULT;
	/**
	 * 资源类型
	 */
	@Column("res_type")
	private RESOURCE_TYPE type = RESOURCE_TYPE.DEFAULT;

	/**
	 * @return the id
	 */
	public int getId() {
		return id;
	}

	/**
	 * @param id
	 *            the id to set
	 */
	public void setId(int id) {
		this.id = id;
	}

	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}

	/**
	 * @param name
	 *            the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * @return the createDate
	 */
	public Date getCreateDate() {
		return createDate;
	}

	/**
	 * @param createDate
	 *            the createDate to set
	 */
	public void setCreateDate(Date createDate) {
		this.createDate = createDate;
	}

	/**
	 * @return the modifyDate
	 */
	public Date getModifyDate() {
		return modifyDate;
	}

	/**
	 * @param modifyDate
	 *            the modifyDate to set
	 */
	public void setModifyDate(Date modifyDate) {
		this.modifyDate = modifyDate;
	}

	/**
	 * @return the status
	 */
	public RESOURCE_STATUS getStatus() {
		return status;
	}

	/**
	 * @param status
	 *            the status to set
	 */
	public void setStatus(RESOURCE_STATUS status) {
		this.status = status;
	}

	/**
	 * @return the type
	 */
	public RESOURCE_TYPE getType() {
		return type;
	}

	/**
	 * @param type
	 *            the type to set
	 */
	public void setType(RESOURCE_TYPE type) {
		this.type = type;
	}

	/**
	 * 启动资源,具体的类型有实现的时候可以覆盖改方法,不写成抽象的类型是因为此类可能需要实例化(stop,restart,getLog一样的原理),
	 * 如果此类没有实现那么在业务中也不会存在调用,就算脑残到调用了也只是抛出一个运行时异常
	 * 
	 * @return
	 */
	public boolean start() {
		throw Lang.wrapThrow(new RuntimeException("Resource '" + name + "' can't be started because it's a/(an) " + type + " Resource"));
	}

	/**
	 * 关闭资源
	 * 
	 * @return
	 */
	public boolean stop() {
		throw Lang.wrapThrow(new RuntimeException("Resource '" + name + "' can't be stoped because it's a/(an) " + type + " Resource"));
	}

	/**
	 * 重启资源
	 * 
	 * @return
	 */
	public boolean restart() {
		throw Lang.wrapThrow(new RuntimeException("Resource '" + name + "' can't be restarted because it's a/(an) " + type + " Resource"));
	}

	/**
	 * 获取日志
	 * 
	 * @param type
	 *            日志类型
	 * @return
	 */
	public String getLog(RESOURCE_LOG_TYPE type) {
		throw Lang.wrapThrow(new RuntimeException("Resource '" + name + "' has no " + type + " log "));
	}

}
